Ovladajte preoblikovanjem podataka s Python Pandas pivot tablicama. Detaljan uvid u sintaksu, napredne tehnike i praktične primjere za globalnu analizu podataka.
Python Pandas Pivot Tablice: Sveobuhvatan vodič za preoblikovanje podataka
U svijetu analize podataka, sposobnost sažimanja, agregiranja i restrukturiranja podataka nije samo vještina – to je supermoć. Neobrađeni podaci, u svom izvornom obliku, često nalikuju na opsežnu, detaljnu knjigu. Bogati su informacijama, ali ih je teško interpretirati. Da bismo izvukli značajne uvide, moramo tu knjigu transformirati u sažeti pregled. Upravo tu pivot tablice briljiraju, a za Python programere, Pandas biblioteka pruža moćan i fleksibilan alat: pivot_table().
Ovaj je vodič namijenjen globalnoj publici analitičara podataka, znanstvenika i entuzijasta Pythona. Detaljno ćemo zaroniti u mehaniku Pandas pivot tablica, prelazeći od temeljnih koncepata do naprednih tehnika. Bez obzira na to sažimate li podatke o prodaji s različitih kontinenata, analizirate li klimatske podatke po regijama ili pratite metrike projekata za distribuirani tim, ovladavanje pivot tablicama temeljno će promijeniti vaš pristup istraživanju podataka.
Što je točno pivot tablica?
Ako ste ikada koristili softver za proračunske tablice kao što su Microsoft Excel ili Google Sheets, vjerojatno ste upoznati s konceptom pivot tablice. To je interaktivna tablica koja vam omogućuje reorganizaciju i sažimanje odabranih stupaca i redaka podataka iz većeg skupa podataka kako biste dobili željeno izvješće.
Pivot tablica radi dvije ključne stvari:
- Agregacija: Izračunava sažetu statistiku (poput zbroja, prosjeka ili broja) za numeričke podatke grupirane po jednoj ili više kategorija.
- Preoblikovanje: Transformira podatke iz 'dugog' formata u 'širok' format. Umjesto da ima sve vrijednosti u jednom stupcu, ona 'pivota' jedinstvene vrijednosti iz stupca u nove stupce u izlazu.
Pandas funkcija pivot_table() donosi ovu moćnu funkcionalnost izravno u vaš tijek rada analize podataka u Pythonu, omogućujući ponovljivo, skriptabilno i skalabilno preoblikovanje podataka.
Postavljanje vašeg okruženja i uzorkovanih podataka
Prije nego što počnemo, provjerite imate li instaliranu Pandas biblioteku. Ako ne, možete je instalirati pomoću pipa, Pythonovog upravitelja paketa:
pip install pandas
Sada je uvezimo u naš Python skriptu ili bilježnicu:
import pandas as pd
import numpy as np
Stvaranje globalnog skupa podataka o prodaji
Kako bismo naše primjere učinili praktičnim i globalno relevantnim, stvorit ćemo sintetički skup podataka koji predstavlja podatke o prodaji za multinacionalnu tvrtku za e-trgovinu. Ovaj skup podataka uključivat će informacije o prodaji iz različitih regija, zemalja i kategorija proizvoda.
# Create a dictionary of data
data = {
'TransactionID': range(1, 21),
'Date': pd.to_datetime([
'2023-01-15', '2023-01-16', '2023-01-17', '2023-02-10', '2023-02-11',
'2023-02-12', '2023-03-05', '2023-03-06', '2023-03-07', '2023-01-20',
'2023-01-21', '2023-02-15', '2023-02-16', '2023-03-10', '2023-03-11',
'2023-01-18', '2023-02-20', '2023-03-22', '2023-01-25', '2023-02-28'
]),
'Region': [
'North America', 'Europe', 'Asia', 'North America', 'Europe', 'Asia', 'North America', 'Europe', 'Asia', 'Europe',
'Asia', 'North America', 'Europe', 'Asia', 'North America', 'Asia', 'Europe', 'North America', 'Europe', 'Asia'
],
'Country': [
'USA', 'Germany', 'Japan', 'Canada', 'France', 'India', 'USA', 'UK', 'China', 'Germany',
'Japan', 'USA', 'France', 'India', 'Canada', 'China', 'UK', 'USA', 'Germany', 'India'
],
'Product_Category': [
'Electronics', 'Apparel', 'Electronics', 'Books', 'Apparel', 'Electronics', 'Books', 'Electronics', 'Apparel',
'Apparel', 'Books', 'Electronics', 'Books', 'Apparel', 'Electronics', 'Books', 'Apparel', 'Books', 'Electronics', 'Electronics'
],
'Units_Sold': [10, 5, 8, 20, 7, 12, 15, 9, 25, 6, 30, 11, 18, 22, 14, 28, 4, 16, 13, 10],
'Unit_Price': [1200, 50, 900, 15, 60, 1100, 18, 950, 45, 55, 12, 1300, 20, 40, 1250, 14, 65, 16, 1150, 1050]
}
# Create DataFrame
df = pd.DataFrame(data)
# Calculate Revenue
df['Revenue'] = df['Units_Sold'] * df['Unit_Price']
# Display the first few rows of the DataFrame
print(df.head())
Ovaj skup podataka daje nam čvrst temelj s mješavinom kategoričkih podataka (Region, Country, Product_Category), numeričkih podataka (Units_Sold, Revenue) i vremensko-serijskih podataka (Date).
Anatomija funkcije pivot_table()
Pandas funkcija pivot_table() je nevjerojatno svestrana. Razložimo njene najvažnije parametre:
pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, margins_name='All')
- data: DataFrame koji želite pivotirati.
- values: Stupac(i) koji sadrže podatke za agregaciju. Ako nije navedeno, koristit će se svi preostali numerički stupci.
- index: Stupac(i) čije će jedinstvene vrijednosti formirati retke nove pivot tablice. To se ponekad naziva 'ključem grupiranja'.
- columns: Stupac(i) čije će se jedinstvene vrijednosti 'pivotirati' kako bi formirale stupce nove tablice.
- aggfunc: Agregacijska funkcija koju treba primijeniti na 'values'. To može biti string poput 'sum', 'mean', 'count', 'min', 'max' ili funkcija poput
np.sum. Možete proslijediti i popis funkcija ili rječnik za primjenu različitih funkcija na različite stupce. Zadana vrijednost je 'mean'. - fill_value: Vrijednost kojom se zamjenjuju svi nedostajući rezultati (NaNs) u pivot tablici.
- margins: Booleova vrijednost. Ako je postavljena na
True, dodaje podzbrojeve za retke i stupce (poznate i kao ukupni zbroj). - margins_name: Naziv za redak/stupac koji sadrži zbrojeve kada je
margins=True. Zadana vrijednost je 'All'.
Vaša prva pivot tablica: Jednostavan primjer
Započnimo s uobičajenim poslovnim pitanjem: "Koji je ukupni prihod generiran po svakoj kategoriji proizvoda?"
Da bismo odgovorili na to, moramo:
- Koristiti
Product_Categoryza retke (index). - Agregirati stupac
Revenue(values). - Koristiti zbroj kao našu agregacijsku funkciju (aggfunc).
# Simple pivot table to see total revenue by product category
category_revenue = pd.pivot_table(df,
values='Revenue',
index='Product_Category',
aggfunc='sum')
print(category_revenue)
Izlaz:
Revenue
Product_Category
Apparel 1645
Books 1184
Electronics 56850
Odmah imamo jasan, sažet pregled. Siromašan dnevnik transakcija od 20 redaka preoblikovan je u tablicu od 3 retka koja izravno odgovara na naše pitanje. To je temeljna moć pivot tablice.
Dodavanje dimenzije stupca
Sada, proširimo ovo. Što ako želimo vidjeti ukupni prihod po kategoriji proizvoda, ali i podijeljen po regijama? Ovdje u igru ulazi parametar columns.
# Pivot table with index and columns
revenue_by_category_region = pd.pivot_table(df,
values='Revenue',
index='Product_Category',
columns='Region',
aggfunc='sum')
print(revenue_by_category_region)
Izlaz:
Region Asia Europe North America Product_Category Apparel 1125.0 625.0 NaN Books 336.0 360.0 488.0 Electronics 13200.0 14550.0 29100.0
Ovaj izlaz je mnogo bogatiji. Pivotirali smo jedinstvene vrijednosti iz stupca 'Region' ('Asia', 'Europe', 'North America') u nove stupce. Sada možemo lako usporediti kako različite kategorije proizvoda funkcioniraju u različitim regijama. Također vidimo vrijednost NaN (Not a Number). To ukazuje da u našem skupu podataka nije zabilježena prodaja 'Apparel' za 'North America'. Ovo je samo po sebi vrijedna informacija!
Napredne tehnike pivotiranja
Osnove su moćne, ali prava fleksibilnost funkcije pivot_table() otkriva se u njenim naprednim značajkama.
Rukovanje nedostajućim vrijednostima pomoću fill_value
Vrijednost NaN u našoj prethodnoj tablici je točna, ali za izvještavanje ili daljnje izračune, možda bi bilo poželjnije prikazati je kao nulu. Parametar fill_value to olakšava.
# Using fill_value to replace NaN with 0
revenue_by_category_region_filled = pd.pivot_table(df,
values='Revenue',
index='Product_Category',
columns='Region',
aggfunc='sum',
fill_value=0)
print(revenue_by_category_region_filled)
Izlaz:
Region Asia Europe North America Product_Category Apparel 1125 625 0 Books 336 360 488 Electronics 13200 14550 29100
Tablica je sada čišća i lakša za čitanje, posebno za netehničku publiku.
Rad s višestrukim indeksima (Hijerarhijsko indeksiranje)
Što ako trebate grupirati po više od jedne kategorije u recima? Na primjer, razložimo prodaju po Region, a zatim po Country unutar svake regije. Možemo proslijediti popis stupaca parametru index.
# Multi-level pivot table using a list for the index
multi_index_pivot = pd.pivot_table(df,
values='Revenue',
index=['Region', 'Country'],
aggfunc='sum',
fill_value=0)
print(multi_index_pivot)
Izlaz:
Revenue
Region Country
Asia China 488
India 1760
Japan 10860
Europe France 1020
Germany 14440
UK 1115
North America Canada 17800
USA 12058
Pandas je automatski stvorio MultiIndex na recima. Ova hijerarhijska struktura je fantastična za dubinsko pretraživanje podataka i uočavanje ugniježđenih odnosa. Istu logiku možete primijeniti na parametar columns za stvaranje hijerarhijskih stupaca.
Korištenje više funkcija agregacije
Ponekad jedna sažeta statistika nije dovoljna. Možda želite vidjeti i ukupni prihod (sum) i prosječnu veličinu transakcije (mean) za svaku grupu. Možete proslijediti popis funkcija parametru aggfunc.
# Using multiple aggregation functions
multi_agg_pivot = pd.pivot_table(df,
values='Revenue',
index='Region',
aggfunc=['sum', 'mean', 'count'])
print(multi_agg_pivot)
Izlaz:
sum mean count
Revenue Revenue Revenue
Region
Asia 13108.000000 2184.666667 6
Europe 16575.000000 2762.500000 6
North America 29858.000000 4976.333333 6
Ova jedinstvena naredba daje nam sveobuhvatan sažetak: ukupni prihod, prosječni prihod po transakciji i broj transakcija za svaku regiju. Primijetite kako Pandas stvara hijerarhijske stupce kako bi izlaz bio organiziran.
Primjena različitih funkcija na različite vrijednosti
Možete biti još granularniji. Zamislite da želite vidjeti zbroj Revenue, ali prosjek Units_Sold. Možete proslijediti rječnik parametru aggfunc gdje su ključevi nazivi stupaca ('values'), a vrijednosti željene funkcije agregacije.
# Different aggregations for different values
dict_agg_pivot = pd.pivot_table(df,
index='Region',
values=['Revenue', 'Units_Sold'],
aggfunc={
'Revenue': 'sum',
'Units_Sold': 'mean'
},
fill_value=0)
print(dict_agg_pivot)
Izlaz:
Revenue Units_Sold
Region
Asia 13108 17.833333
Europe 16575 8.166667
North America 29858 14.333333
Ova razina kontrole čini pivot_table() vrhunskim alatom za sofisticiranu analizu podataka.
Izračunavanje ukupnih zbrojeva s margins
Za potrebe izvještavanja, zbrojevi redaka i stupaca često su bitni. Argument margins=True to pruža bez ikakvog dodatnog napora.
# Adding totals with margins=True
revenue_with_margins = pd.pivot_table(df,
values='Revenue',
index='Product_Category',
columns='Region',
aggfunc='sum',
fill_value=0,
margins=True,
margins_name='Grand Total') # Custom name for totals
print(revenue_with_margins)
Izlaz:
Region Asia Europe North America Grand Total Product_Category Apparel 1125 625 0 1750 Books 336 360 488 1184 Electronics 13200 14550 29100 56850 Grand Total 14661 15535 29588 59784
Pandas automatski izračunava zbroj za svaki redak (ukupni prihod po kategoriji proizvoda u svim regijama) i svaki stupac (ukupni prihod po regiji u svim kategorijama), plus ukupni zbroj za sve podatke u donjem desnom kutu.
Praktična primjena: Vremenski bazirana analiza
Pivot tablice nisu ograničene na statičke kategorije. Nevjerojatno su korisne za analizu vremenskih serija podataka. Pronađimo ukupni prihod za svaki mjesec.
Prvo, moramo izdvojiti mjesec iz našeg stupca 'Date'. Za to možemo koristiti .dt pristupnik u Pandasu.
# Extract month from the Date column
df['Month'] = df['Date'].dt.month_name()
# Pivot to see monthly revenue by product category
monthly_revenue = pd.pivot_table(df,
values='Revenue',
index='Month',
columns='Product_Category',
aggfunc='sum',
fill_value=0)
# Optional: Order the months correctly
month_order = ['January', 'February', 'March']
monthly_revenue = monthly_revenue.reindex(month_order)
print(monthly_revenue)
Izlaz:
Product_Category Apparel Books Electronics Month January 250 360 23100 February 795 794 24250 March 705 30 9500
Ova tablica nam daje jasan pregled performansi prodaje svake kategorije tijekom vremena, omogućujući nam da lako uočimo trendove, sezonalnost ili anomalije.
pivot_table() vs. groupby(): Koja je razlika?
Ovo je često pitanje za one koji uče Pandas. Dvije funkcije su usko povezane, a zapravo je pivot_table() izgrađena na vrhu groupby().
groupby()je općenitija i temeljnija operacija. Grupiraju podatke na temelju nekih kriterija, a zatim vam omogućuju primjenu funkcije agregacije. Rezultat je obično Pandas Series ili DataFrame s hijerarhijskim indeksom, ali ostaje u 'dugom' formatu.pivot_table()je specijalizirani alat koji izvodi grupiranje, a zatim preoblikuje podatke. Njegova je primarna svrha transformirati podatke iz dugog formata u široki format, koji je često čitljiviji ljudima.
Vratimo se na naš prvi primjer koristeći groupby():
# Same result as our first pivot table, but using groupby
category_revenue_groupby = df.groupby('Product_Category')['Revenue'].sum()
print(category_revenue_groupby)
Rezultat je Pandas Series koji je funkcionalno ekvivalentan DataFrameu iz naše prve pivot tablice. Međutim, kada uvedete drugi ključ grupiranja (poput 'Region'), razlika postaje jasna.
# Grouping by two columns
groupby_multi = df.groupby(['Product_Category', 'Region'])['Revenue'].sum()
print(groupby_multi)
Izlaz (Series s MultiIndexom):
Product_Category Region
Apparel Asia 1125
Europe 625
Books Asia 336
Europe 360
North America 488
Electronics Asia 13200
Europe 14550
North America 29100
Name: Revenue, dtype: int64
Da biste dobili isti 'široki' format kao pivot_table(index='Product_Category', columns='Region'), trebali biste koristiti groupby() nakon čega slijedi unstack():
# Replicating a pivot table with groupby().unstack()
groupby_unstack = df.groupby(['Product_Category', 'Region'])['Revenue'].sum().unstack(fill_value=0)
print(groupby_unstack)
Ovo proizvodi potpuno isti izlaz kao naša pivot tablica sa stupcima. Dakle, funkciju pivot_table() možete smatrati prikladnim prečacem za uobičajeni tijek rada groupby().aggregate().unstack().
Kada koristiti koju?
- Koristite
pivot_table()kada želite ljudima čitljiv, široki format izlaza, posebno za izvještavanje ili stvaranje unakrsnih tablica. - Koristite
groupby()kada vam je potrebna veća fleksibilnost, kada izvodite privremene izračune u cjevovodu za obradu podataka ili kada preoblikovani, široki format nije vaš krajnji cilj.
Performanse i najbolje prakse
Iako je pivot_table() moćna, važno ju je učinkovito koristiti, posebno s velikim skupovima podataka.
- Prvo filtrirajte, kasnije pivotirajte: Ako trebate analizirati samo podskup podataka (npr. prodaju iz prošle godine), filtrirajte DataFrame prije primjene pivot tablice. To smanjuje količinu podataka koju funkcija mora obraditi.
- Koristite kategoričke tipove: Za stupce koje često koristite kao indekse ili stupce u svojim pivot tablicama (poput 'Region' ili 'Product_Category'), pretvorite ih u 'category' dtype u Pandasu. To može značajno smanjiti potrošnju memorije i ubrzati operacije grupiranja.
df['Region'] = df['Region'].astype('category') - Neka bude čitljivo: Izbjegavajte stvaranje pivot tablica s previše indeksa i stupaca. Iako je moguće, pivot tablica koja je stotine stupaca široka i tisuće redaka dugačka može postati jednako nečitljiva kao izvorni sirovi podaci. Koristite je za stvaranje ciljanih sažetaka.
- Razumijte agregaciju: Budite svjesni svog izbora
aggfunc. Korištenje 'sum' za cijene nema smisla, dok 'mean' može biti prikladnije. Uvijek osigurajte da se vaša agregacija podudara s pitanjem na koje pokušavate odgovoriti.
Zaključak: Vaš alat za pronicljive sažetke
Pandas funkcija pivot_table() je nezamjenjiv alat u alatu svakog analitičara podataka. Pruža deklarativan, izražajan i moćan način za prelazak s neurednih, detaljnih podataka na čiste, pronicljive sažetke. Razumijevanjem i ovladavanjem njegovim ključnim komponentama — values, index, columns i aggfunc — te korištenjem njegovih naprednih značajki poput višerazinskog indeksiranja, prilagođenih agregacija i margina, možete preoblikovati svoje podatke kako biste odgovorili na složena poslovna pitanja sa samo nekoliko redaka Python koda.
Sljedeći put kada se suočite s velikim skupom podataka, oduprite se porivu da skrolate kroz beskrajne retke. Umjesto toga, razmislite o pitanjima na koja trebate odgovoriti i kako pivot tablica može preoblikovati vaše podatke kako bi otkrila priče skrivene unutar njih. Sretno pivotiranje!